package cn.centec.bid.util;

import cn.centec.bid.entity.*;
import cn.centec.core.constant.RequestMethod;
import cn.centec.core.entity.IdName;
import cn.centec.core.entity.ListStr;
import cn.centec.core.entity.Result;
import cn.centec.core.util.JsonUtil;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 采购中心AIP工具 - 请求处理器 - 招投标业务
 *
 * @author 延晓磊
 * @since 2022年09月15日
 */
public abstract class Centec6BidRequestHandler {

    /**
     * 发起请求
     *
     * @param method
     * @param param
     * @return
     *
     * @author 延晓磊
     * @since 2022年11月03日
     */
    public abstract Result request(String method, Object param);

    /**
     * 开始招标
     *
     * 场景：发布/报价开始时间
     *
     * @param param
     *
     * @author 延晓磊
     * @since 2022年11月03日
     */
    public void startPurchase(StandardPurchaseStartParam param) {
        this.request(RequestMethod.Bid.Request.PURCHASE_START, param);
    }

    /**
     * 终止采购
     *
     * 场景：报价中 > 终止
     *
     * @param param
     *
     * @author 延晓磊
     * @since 2022年11月07日
     */
    public void stopPurchase(StandardPurchaseStopParam param) {
        this.request(RequestMethod.Bid.Request.PURCHASE_STOP, param);
    }

    /**
     * 延标/修改开标时间
     *
     * 场景：报价中 > 修改报价结束时间
     *
     * @param id
     * @param endTime
     *
     * @author 延晓磊
     * @since 2022年11月07日
     */
    public void delayPurchase(String id, LocalDateTime endTime) {
        StandardPurchaseDelayParam param = new StandardPurchaseDelayParam();
        param.setId(id);
        param.setEndTime(endTime);
        this.request(RequestMethod.Bid.Request.PURCHASE_DELAY, param);
    }

    /**
     * 开标
     *
     * 场景：报价中 > 开标/报价结束时间
     *
     * @param id
     *
     * @author 延晓磊
     * @since 2022年11月07日
     */
    public void openPurchase(String id) {
        StandardPurchaseOpenParam param = new StandardPurchaseOpenParam();
        param.setId(id);
        this.request(RequestMethod.Bid.Request.PURCHASE_OPEN, param);
    }

    /**
     * 重启
     *
     * 场景：开标中 > 报价中，修改报价结束时间
     *
     * @param id
     * @param endTime
     *
     * @author 延晓磊
     * @since 2022年11月07日
     */
    public void restartPurchase(String id, LocalDateTime endTime) {
        StandardPurchaseRestartParam param = new StandardPurchaseRestartParam();
        param.setId(id);
        param.setEndTime(endTime);
        this.request(RequestMethod.Bid.Request.PURCHASE_RESTART, param);
    }

    /**
     * 流标
     *
     * 场景：开标中 > 流标
     *
     * @param param
     *
     * @author 延晓磊
     * @since 2022年11月07日
     */
    public void flowPurchase(StandardPurchaseFlowParam param) {
        this.request(RequestMethod.Bid.Request.PURCHASE_FLOW, param);
    }

    /**
     * 再次采购
     *
     * 场景：开标中 > 供应商二次报价
     *
     * @param id
     * @param endTime
     * @param suppliers
     *
     * @author 延晓磊
     * @since 2022年11月07日
     */
    public void againPurchase(String id, LocalDateTime endTime, List<Long> suppliers) {
        StandardPurchaseAgainParam param = new StandardPurchaseAgainParam();
        param.setId(id);
        param.setEndTime(endTime);
        param.setSuppliers(suppliers);
        this.request(RequestMethod.Bid.Request.PURCHASE_AGAIN, param);
    }

    /**
     * 采购信息-完成（修改采购状态，通知供应商中标）
     *
     * 场景：开标中 > 定标/完成
     *
     * @param param
     *
     * @author 延晓磊
     * @since 2022年11月07日
     */
    public void finishPurchase(StandardPurchaseFinishParam param){
        this.request(RequestMethod.Bid.Request.PURCHASE_FINISH, param);
    }

    /**
     * 采购信息-变更中标方（修改采购状态，通知供应商中标/未中标）
     *
     * 场景：已定标 > 变更中标方（displacedList,supplyList）
     * 场景：已定标 > 增加中标方（supplyList）
     * 场景：已流标 > 选择中标方（supplyList）
     *
     * @param param
     *
     * @author 延晓磊
     * @since 2022年11月07日
     */
    public void changePurchase(StandardPurchaseChangeParam param){
        this.request(RequestMethod.Bid.Request.PURCHASE_CHANGE, param);
    }

    /**
     * 合同补充
     *
     * @param param
     * @return
     *
     * @author 延晓磊
     *
     * @since 2019年12月23日
     */
    public void supplementContract(StandardContractSupplementParam param) {
        this.request(RequestMethod.Bid.Request.CONTRACT_SUPPLEMENT, param);
    }

    /**
     * 创建合同
     *
     * @param param
     * @return
     *
     * @author 延晓磊
     *
     * @since 2019年12月12日
     */
    public void createContract(StandardContractCreateParam param) {
        this.request(RequestMethod.Bid.Request.CONTRACT_CREATE, param);
    }

    /**
     * 修改合同状态
     *
     * @param param
     * @return
     *
     * @author 延晓磊
     *
     * @since 2020年03月19日
     */
    public void updateContractStatus(StandardContractStatusUpdateParam param) {
        this.request(RequestMethod.Bid.Request.CONTRACT_STATUS_UPDATE, param);
    }

    /**
     * 创建订单
     *
     * @param param
     * @return
     *
     * @author 延晓磊
     *
     * @since 2019年12月12日
     */
    public void createOrder(StandardOrderCreateParam param) {
        this.request(RequestMethod.Bid.Request.ORDER_CREATE, param);
    }

    /**
     * 取消订单
     *
     * @param param
     * @return
     *
     * @author 延晓磊
     *
     * @since 2019年12月23日
     */
    public void cancelOrder(StandardOrderCancelParam param) {
        this.request(RequestMethod.Bid.Request.ORDER_CANCEL, param);
    }

    /**
     * 完成订单
     *
     * @param param
     * @return
     *
     * @author 延晓磊
     *
     * @since 2019年12月23日
     */
    public void finishOrder(StandardOrderFinishParam param) {
        this.request(RequestMethod.Bid.Request.ORDER_FINISH, param);
    }

    /**
     * 查询供应商
     *
     * @param param
     * @return
     *
     * @author 延晓磊
     * @since 2022年11月11日
     */
    public Result listSupplier(StandardSupplierListParam param){
        return this.request(RequestMethod.Bid.Request.SUPPLIER_LIST, param);
    }

    /**
     * 查询供应商名称
     *
     * @param name
     * @return {list:[{id,name}]}
     *
     * @author 延晓磊
     * @since 2022年11月30日
     */
    public Result listSupplierName(String name){
        StandardSupplierListParam param = new StandardSupplierListParam();
        param.setMode("name");
        param.setName(name);
        return this.listSupplier(param);
    }

    /**
     * 查询供应商名称
     *
     * @param name
     * @return {list:[{id,name}]}
     *
     * @author 延晓磊
     * @since 2022年11月30日
     */
    public List<IdName> listSupplierNameList(String name){
        return this.listSupplierName(name).restList(IdName.class);
    }

    /**
     * 查询供应商名称
     *
     * @param ids
     * @return {list:[{id,name}]}
     *
     * @author 延晓磊
     * @since 2022年11月30日
     */
    public Result listSupplierName(List<Long> ids){
        StandardSupplierListParam param = new StandardSupplierListParam();
        param.setMode("name");
        param.setIds(ids);
        return this.listSupplier(param);
    }

    /**
     * 查询供应商名称
     *
     * @param ids
     * @return {list:[{id,name}]}
     *
     * @author 延晓磊
     * @since 2022年11月30日
     */
    public List<IdName> listSupplierNameList(List<Long> ids){
        return this.listSupplierName(ids).restList(IdName.class);
    }

    /**
     * 查询供应商联系人
     *
     * @param ids
     * @return {list:[{id,name,contactUser,contactPhone}]}
     *
     * @author 延晓磊
     * @since 2022年11月30日
     */
    public Result listSupplierContact(List<Long> ids){
        StandardSupplierListParam param = new StandardSupplierListParam();
        param.setResultFields(ListStr.getInstance("contact"));
        param.setIds(ids);
        return this.listSupplier(param);
    }

    /**
     * 查询供应商联系人
     *
     * @param ids
     * @return {list:[{id,name,contactUser,contactPhone}]}
     *
     * @author 延晓磊
     * @since 2022年11月30日
     */
    public List<StandardSupplierListResult> listSupplierContactList(List<Long> ids){
        return this.listSupplierContact(ids).restList(StandardSupplierListResult.class);
    }

    /**
     * 查看供应商
     *
     * @param param
     * @return
     *
     * @author 延晓磊
     * @since 2022年11月11日
     */
    public StandardSupplierInfoResult getSupplier(StandardSupplierInfoParam param){
        return this.request(RequestMethod.Bid.Request.SUPPLIER_INFO, JsonUtil.toString(param)).getObj(StandardSupplierInfoResult.class);
    }

    /**
     * 开启采购企业准入配置
     * @param param
     * @return
     * @author 张敏
     * @since 2023-03-13
     */
    public void openPurchaserAccessConfig(StandardPurchaserAccessConfigStartParam param){
        this.request(RequestMethod.Bid.Request.OPEN_PURCHASER_ACCESS_CONFIG, param).rest();
    }

    /**
     * 关闭采购企业准入配置
     * @param param
     * @return
     * @author 张敏
     * @since 2023-03-13
     */
    public void closePurchaserAccessConfig(StandardPurchaserAccessConfigStartParam param){
        this.request(RequestMethod.Bid.Request.CLOSE_PURCHASER_ACCESS_CONFIG, param).rest();
    }

    /**
     * 采购企业审核供应商准入资料
     * @param param
     * @return
     * @author 张敏
     * @since 2023-03-13
     */
    public void purchaserAuditSupplierInfo(StandardAuditSupplierInfoParam param){
        this.request(RequestMethod.Bid.Request.PURCHASER_AUDIT_SUPPLIER_INFO, param).rest();
    }

    /**
     * 新增内部供应商
     *
     * @param param
     * @return
     *
     * @author 张敏
     * @since 2022-12-06
     */
    public void bindInsideSupplier(StandardInsideSupplierAddParam param) {
        this.request(RequestMethod.Bid.Request.BIND_INSIDE_SUPPLIER, param).rest();
    }
}
